//
//  Label.swift
//  myhub
//
//  Created by x on 2024/6/1.
//

import Foundation

/*
 ## 自定义View 控件自动计算size能力, 满足任意条件之一
    1. 自定义控件实现intrinsicContentSize的重写并返回合适大小，适合子控件存在 frame初始化，或者动态添加。
    2. 自定义控件内部约束满足
    如果自定义控件即满足了所有约束，又重写了intrinsicContentSize返回了计算大小怎么办。答案只有一个，执行约束，忽略 intrinsicContentSize.
 
    * intrinsicContentSize： 又叫内容大小，决定了控件自动布局下的大小，（当控件没有宽高约束的时候，系统会自动添加宽高约束）自定义控件重写 intrisicContentsize 返回内在大小，自动布局系统就可以自己确定控件大小，就像使用UILabel,根据文本多少弹性控制大小。
    ```
        override var intrinsiµcContentSize: CGSize {
            return CGSize(width: UIView.noIntrinsicMetric, height: itemH)
        }
    ```
    //（UIView.noIntrinsicMetric,UIView.noIntrinsicMetric）=== （-1， -1）,等效
    invalidateIntrinsicContentSize()： 方法的作用是重新计算intrinsicContentSize,相当于原来的内置大小失效，以便再合适的机会重新生效一个新的，
*/

open class Label: UILabel {
    public var textInsets = UIEdgeInsets.zero {
        didSet {
            invalidateIntrinsicContentSize()
        }
    }

    public override init(frame: CGRect) {
        super.init(frame: frame)
        makeUI()
    }
    public required init?(coder: NSCoder) {
        super.init(coder: coder)
        makeUI()
    }
    open func makeUI() {
        layer.masksToBounds = true
        numberOfLines = 1
        updateUI()
    }
    open func updateUI() {
        setNeedsDisplay()
    }
}
extension Label {
    open override func textRect(forBounds bounds: CGRect, limitedToNumberOfLines numberOfLines: Int) -> CGRect {
        // 根据textInsets，获取新的bounds
        let insetRect = bounds.inset(by: textInsets)
        // 获取新的文本rect
        let textRect = super.textRect(forBounds: insetRect, limitedToNumberOfLines: numberOfLines)
        // 反转textInsets
        let invertedInsets = UIEdgeInsets(top: -textInsets.top,
                                          left: -textInsets.left,
                                          bottom: -textInsets.bottom,
                                          right: -textInsets.right)
        // 获取新的bounds，这样textRect，不会变，而且还加入了textInsets属性。
        return textRect.inset(by: invertedInsets)
    }

    open override func drawText(in rect: CGRect) {
        super.drawText(in: rect.inset(by: textInsets))
    }

    public var leftTextInset: CGFloat {
        get { return textInsets.left }
        set { textInsets.left = newValue }
    }

    public var rightTextInset: CGFloat {
        get { return textInsets.right }
        set { textInsets.right = newValue }
    }

    public var topTextInset: CGFloat {
        get { return textInsets.top }
        set { textInsets.top = newValue }
    }

    public var bottomTextInset: CGFloat {
        get { return textInsets.bottom }
        set { textInsets.bottom = newValue }
    }
}
